home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / lib-tk / turtle.pyc (.txt) < prev   
Python Compiled Bytecode  |  2008-10-29  |  31KB  |  1,108 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''
  5. Turtle graphics is a popular way for introducing programming to
  6. kids. It was part of the original Logo programming language developed
  7. by Wally Feurzeig and Seymour Papert in 1966.
  8.  
  9. Imagine a robotic turtle starting at (0, 0) in the x-y plane. Give it
  10. the command turtle.forward(15), and it moves (on-screen!) 15 pixels in
  11. the direction it is facing, drawing a line as it moves. Give it the
  12. command turtle.left(25), and it rotates in-place 25 degrees clockwise.
  13.  
  14. By combining together these and similar commands, intricate shapes and
  15. pictures can easily be drawn.
  16. '''
  17. from math import *
  18. from time import sleep
  19. import Tkinter
  20. speeds = [
  21.     'fastest',
  22.     'fast',
  23.     'normal',
  24.     'slow',
  25.     'slowest']
  26.  
  27. class Error(Exception):
  28.     pass
  29.  
  30.  
  31. class RawPen:
  32.     
  33.     def __init__(self, canvas):
  34.         self._canvas = canvas
  35.         self._items = []
  36.         self._tracing = 1
  37.         self._arrow = 0
  38.         self._delay = 10
  39.         self._angle = 0
  40.         self.degrees()
  41.         self.reset()
  42.  
  43.     
  44.     def degrees(self, fullcircle = 360):
  45.         ''' Set angle measurement units to degrees.
  46.  
  47.         Example:
  48.         >>> turtle.degrees()
  49.         '''
  50.         if self._angle:
  51.             self._angle = (self._angle / self._fullcircle) * fullcircle
  52.         
  53.         self._fullcircle = fullcircle
  54.         self._invradian = pi / fullcircle * 0.5
  55.  
  56.     
  57.     def radians(self):
  58.         ''' Set the angle measurement units to radians.
  59.  
  60.         Example:
  61.         >>> turtle.radians()
  62.         '''
  63.         self.degrees(2 * pi)
  64.  
  65.     
  66.     def reset(self):
  67.         ''' Clear the screen, re-center the pen, and set variables to
  68.         the default values.
  69.  
  70.         Example:
  71.         >>> turtle.position()
  72.         [0.0, -22.0]
  73.         >>> turtle.heading()
  74.         100.0
  75.         >>> turtle.reset()
  76.         >>> turtle.position()
  77.         [0.0, 0.0]
  78.         >>> turtle.heading()
  79.         0.0
  80.         '''
  81.         canvas = self._canvas
  82.         self._canvas.update()
  83.         width = canvas.winfo_width()
  84.         height = canvas.winfo_height()
  85.         if width <= 1:
  86.             width = canvas['width']
  87.         
  88.         if height <= 1:
  89.             height = canvas['height']
  90.         
  91.         self._origin = (float(width) / 2, float(height) / 2)
  92.         self._position = self._origin
  93.         self._angle = 0
  94.         self._drawing = 1
  95.         self._width = 1
  96.         self._color = 'black'
  97.         self._filling = 0
  98.         self._path = []
  99.         self.clear()
  100.         canvas._root().tkraise()
  101.  
  102.     
  103.     def clear(self):
  104.         ''' Clear the screen. The turtle does not move.
  105.  
  106.         Example:
  107.         >>> turtle.clear()
  108.         '''
  109.         self.fill(0)
  110.         canvas = self._canvas
  111.         items = self._items
  112.         self._items = []
  113.         for item in items:
  114.             canvas.delete(item)
  115.         
  116.         self._delete_turtle()
  117.         self._draw_turtle()
  118.  
  119.     
  120.     def tracer(self, flag):
  121.         ''' Set tracing on if flag is True, and off if it is False.
  122.         Tracing means line are drawn more slowly, with an
  123.         animation of an arrow along the line.
  124.  
  125.         Example:
  126.         >>> turtle.tracer(False)   # turns off Tracer
  127.         '''
  128.         self._tracing = flag
  129.         if not self._tracing:
  130.             self._delete_turtle()
  131.         
  132.         self._draw_turtle()
  133.  
  134.     
  135.     def forward(self, distance):
  136.         ''' Go forward distance steps.
  137.  
  138.         Example:
  139.         >>> turtle.position()
  140.         [0.0, 0.0]
  141.         >>> turtle.forward(25)
  142.         >>> turtle.position()
  143.         [25.0, 0.0]
  144.         >>> turtle.forward(-75)
  145.         >>> turtle.position()
  146.         [-50.0, 0.0]
  147.         '''
  148.         (x0, y0) = start = self._position
  149.         x1 = x0 + distance * cos(self._angle * self._invradian)
  150.         y1 = y0 - distance * sin(self._angle * self._invradian)
  151.         self._goto(x1, y1)
  152.  
  153.     
  154.     def backward(self, distance):
  155.         """ Go backwards distance steps.
  156.  
  157.         The turtle's heading does not change.
  158.  
  159.         Example:
  160.         >>> turtle.position()
  161.         [0.0, 0.0]
  162.         >>> turtle.backward(30)
  163.         >>> turtle.position()
  164.         [-30.0, 0.0]
  165.         """
  166.         self.forward(-distance)
  167.  
  168.     
  169.     def left(self, angle):
  170.         ''' Turn left angle units (units are by default degrees,
  171.         but can be set via the degrees() and radians() functions.)
  172.  
  173.         When viewed from above, the turning happens in-place around
  174.         its front tip.
  175.  
  176.         Example:
  177.         >>> turtle.heading()
  178.         22
  179.         >>> turtle.left(45)
  180.         >>> turtle.heading()
  181.         67.0
  182.         '''
  183.         self._angle = (self._angle + angle) % self._fullcircle
  184.         self._draw_turtle()
  185.  
  186.     
  187.     def right(self, angle):
  188.         ''' Turn right angle units (units are by default degrees,
  189.         but can be set via the degrees() and radians() functions.)
  190.  
  191.         When viewed from above, the turning happens in-place around
  192.         its front tip.
  193.  
  194.         Example:
  195.         >>> turtle.heading()
  196.         22
  197.         >>> turtle.right(45)
  198.         >>> turtle.heading()
  199.         337.0
  200.         '''
  201.         self.left(-angle)
  202.  
  203.     
  204.     def up(self):
  205.         ''' Pull the pen up -- no drawing when moving.
  206.  
  207.         Example:
  208.         >>> turtle.up()
  209.         '''
  210.         self._drawing = 0
  211.  
  212.     
  213.     def down(self):
  214.         ''' Put the pen down -- draw when moving.
  215.  
  216.         Example:
  217.         >>> turtle.down()
  218.         '''
  219.         self._drawing = 1
  220.  
  221.     
  222.     def width(self, width):
  223.         ''' Set the line to thickness to width.
  224.  
  225.         Example:
  226.         >>> turtle.width(10)
  227.         '''
  228.         self._width = float(width)
  229.  
  230.     
  231.     def color(self, *args):
  232.         ''' Set the pen color.
  233.  
  234.         Three input formats are allowed:
  235.  
  236.             color(s)
  237.             s is a Tk specification string, such as "red" or "yellow"
  238.  
  239.             color((r, g, b))
  240.             *a tuple* of r, g, and b, which represent, an RGB color,
  241.             and each of r, g, and b are in the range [0..1]
  242.  
  243.             color(r, g, b)
  244.             r, g, and b represent an RGB color, and each of r, g, and b
  245.             are in the range [0..1]
  246.  
  247.         Example:
  248.  
  249.         >>> turtle.color(\'brown\')
  250.         >>> tup = (0.2, 0.8, 0.55)
  251.         >>> turtle.color(tup)
  252.         >>> turtle.color(0, .5, 0)
  253.         '''
  254.         if not args:
  255.             raise Error, 'no color arguments'
  256.         
  257.         if len(args) == 1:
  258.             color = args[0]
  259.             if type(color) == type(''):
  260.                 
  261.                 try:
  262.                     id = self._canvas.create_line(0, 0, 0, 0, fill = color)
  263.                 except Tkinter.TclError:
  264.                     raise Error, 'bad color string: %r' % (color,)
  265.  
  266.                 self._set_color(color)
  267.                 return None
  268.             
  269.             
  270.             try:
  271.                 (r, g, b) = color
  272.             raise Error, 'bad color sequence: %r' % (color,)
  273.  
  274.         else:
  275.             
  276.             try:
  277.                 (r, g, b) = args
  278.             except:
  279.                 raise Error, 'bad color arguments: %r' % (args,)
  280.  
  281.         if r <= r:
  282.             pass
  283.         elif not r <= 1:
  284.             raise AssertionError
  285.         if g <= g:
  286.             pass
  287.         elif not g <= 1:
  288.             raise AssertionError
  289.         if b <= b:
  290.             pass
  291.         elif not b <= 1:
  292.             raise AssertionError
  293.         x = 255
  294.         y = 0.5
  295.         self._set_color('#%02x%02x%02x' % (int(r * x + y), int(g * x + y), int(b * x + y)))
  296.  
  297.     
  298.     def _set_color(self, color):
  299.         self._color = color
  300.         self._draw_turtle()
  301.  
  302.     
  303.     def write(self, text, move = False):
  304.         """ Write text at the current pen position.
  305.  
  306.         If move is true, the pen is moved to the bottom-right corner
  307.         of the text. By default, move is False.
  308.  
  309.         Example:
  310.         >>> turtle.write('The race is on!')
  311.         >>> turtle.write('Home = (0, 0)', True)
  312.         """
  313.         (x, y) = self._position
  314.         x = x - 1
  315.         item = self._canvas.create_text(x, y, text = str(text), anchor = 'sw', fill = self._color)
  316.         self._items.append(item)
  317.         if move:
  318.             (x0, y0, x1, y1) = self._canvas.bbox(item)
  319.             self._goto(x1, y1)
  320.         
  321.         self._draw_turtle()
  322.  
  323.     
  324.     def fill(self, flag):
  325.         ''' Call fill(1) before drawing the shape you
  326.          want to fill, and fill(0) when done.
  327.  
  328.         Example:
  329.         >>> turtle.fill(1)
  330.         >>> turtle.forward(100)
  331.         >>> turtle.left(90)
  332.         >>> turtle.forward(100)
  333.         >>> turtle.left(90)
  334.         >>> turtle.forward(100)
  335.         >>> turtle.left(90)
  336.         >>> turtle.forward(100)
  337.         >>> turtle.fill(0)
  338.         '''
  339.         if self._filling:
  340.             path = tuple(self._path)
  341.             smooth = self._filling < 0
  342.             if len(path) > 2:
  343.                 item = self._canvas._create('polygon', path, {
  344.                     'fill': self._color,
  345.                     'smooth': smooth })
  346.                 self._items.append(item)
  347.                 self._canvas.update()
  348.             
  349.         
  350.         self._path = []
  351.         self._filling = flag
  352.         if flag:
  353.             self._path.append(self._position)
  354.         
  355.  
  356.     
  357.     def begin_fill(self):
  358.         ''' Called just before drawing a shape to be filled.
  359.             Must eventually be followed by a corresponding end_fill() call.
  360.             Otherwise it will be ignored.
  361.  
  362.         Example:
  363.         >>> turtle.begin_fill()
  364.         >>> turtle.forward(100)
  365.         >>> turtle.left(90)
  366.         >>> turtle.forward(100)
  367.         >>> turtle.left(90)
  368.         >>> turtle.forward(100)
  369.         >>> turtle.left(90)
  370.         >>> turtle.forward(100)
  371.         >>> turtle.end_fill()
  372.         '''
  373.         self._path = [
  374.             self._position]
  375.         self._filling = 1
  376.  
  377.     
  378.     def end_fill(self):
  379.         ''' Called after drawing a shape to be filled.
  380.  
  381.         Example:
  382.         >>> turtle.begin_fill()
  383.         >>> turtle.forward(100)
  384.         >>> turtle.left(90)
  385.         >>> turtle.forward(100)
  386.         >>> turtle.left(90)
  387.         >>> turtle.forward(100)
  388.         >>> turtle.left(90)
  389.         >>> turtle.forward(100)
  390.         >>> turtle.end_fill()
  391.         '''
  392.         self.fill(0)
  393.  
  394.     
  395.     def circle(self, radius, extent = None):
  396.         ''' Draw a circle with given radius.
  397.         The center is radius units left of the turtle; extent
  398.         determines which part of the circle is drawn. If not given,
  399.         the entire circle is drawn.
  400.  
  401.         If extent is not a full circle, one endpoint of the arc is the
  402.         current pen position. The arc is drawn in a counter clockwise
  403.         direction if radius is positive, otherwise in a clockwise
  404.         direction. In the process, the direction of the turtle is
  405.         changed by the amount of the extent.
  406.  
  407.         >>> turtle.circle(50)
  408.         >>> turtle.circle(120, 180)  # half a circle
  409.         '''
  410.         if extent is None:
  411.             extent = self._fullcircle
  412.         
  413.         frac = abs(extent) / self._fullcircle
  414.         steps = 1 + int(min(11 + abs(radius) / 6, 59) * frac)
  415.         w = 1 * extent / steps
  416.         w2 = 0.5 * w
  417.         l = 2 * radius * sin(w2 * self._invradian)
  418.         if radius < 0:
  419.             l = -l
  420.             w = -w
  421.             w2 = -w2
  422.         
  423.         self.left(w2)
  424.         for i in range(steps):
  425.             self.forward(l)
  426.             self.left(w)
  427.         
  428.         self.right(w2)
  429.  
  430.     
  431.     def heading(self):
  432.         """ Return the turtle's current heading.
  433.  
  434.         Example:
  435.         >>> turtle.heading()
  436.         67.0
  437.         """
  438.         return self._angle
  439.  
  440.     
  441.     def setheading(self, angle):
  442.         ''' Set the turtle facing the given angle.
  443.  
  444.         Here are some common directions in degrees:
  445.  
  446.            0 - east
  447.           90 - north
  448.          180 - west
  449.          270 - south
  450.  
  451.         Example:
  452.         >>> turtle.setheading(90)
  453.         >>> turtle.heading()
  454.         90
  455.         >>> turtle.setheading(128)
  456.         >>> turtle.heading()
  457.         128
  458.         '''
  459.         self._angle = angle
  460.         self._draw_turtle()
  461.  
  462.     
  463.     def window_width(self):
  464.         ''' Returns the width of the turtle window.
  465.  
  466.         Example:
  467.         >>> turtle.window_width()
  468.         640
  469.         '''
  470.         width = self._canvas.winfo_width()
  471.         if width <= 1:
  472.             width = self._canvas['width']
  473.         
  474.         return width
  475.  
  476.     
  477.     def window_height(self):
  478.         ''' Return the height of the turtle window.
  479.  
  480.         Example:
  481.         >>> turtle.window_height()
  482.         768
  483.         '''
  484.         height = self._canvas.winfo_height()
  485.         if height <= 1:
  486.             height = self._canvas['height']
  487.         
  488.         return height
  489.  
  490.     
  491.     def position(self):
  492.         ''' Return the current (x, y) location of the turtle.
  493.  
  494.         Example:
  495.         >>> turtle.position()
  496.         [0.0, 240.0]
  497.         '''
  498.         (x0, y0) = self._origin
  499.         (x1, y1) = self._position
  500.         return [
  501.             x1 - x0,
  502.             -y1 + y0]
  503.  
  504.     
  505.     def setx(self, xpos):
  506.         """ Set the turtle's x coordinate to be xpos.
  507.  
  508.         Example:
  509.         >>> turtle.position()
  510.         [10.0, 240.0]
  511.         >>> turtle.setx(10)
  512.         >>> turtle.position()
  513.         [10.0, 240.0]
  514.         """
  515.         (x0, y0) = self._origin
  516.         (x1, y1) = self._position
  517.         self._goto(x0 + xpos, y1)
  518.  
  519.     
  520.     def sety(self, ypos):
  521.         """ Set the turtle's y coordinate to be ypos.
  522.  
  523.         Example:
  524.         >>> turtle.position()
  525.         [0.0, 0.0]
  526.         >>> turtle.sety(-22)
  527.         >>> turtle.position()
  528.         [0.0, -22.0]
  529.         """
  530.         (x0, y0) = self._origin
  531.         (x1, y1) = self._position
  532.         self._goto(x1, y0 - ypos)
  533.  
  534.     
  535.     def towards(self, *args):
  536.         '''Returs the angle, which corresponds to the line
  537.         from turtle-position to point (x,y).
  538.  
  539.         Argument can be two coordinates or one pair of coordinates
  540.         or a RawPen/Pen instance.
  541.  
  542.         Example:
  543.         >>> turtle.position()
  544.         [10.0, 10.0]
  545.         >>> turtle.towards(0,0)
  546.         225.0
  547.         '''
  548.         if len(args) == 2:
  549.             (x, y) = args
  550.         else:
  551.             arg = args[0]
  552.             if isinstance(arg, RawPen):
  553.                 (x, y) = arg.position()
  554.             else:
  555.                 (x, y) = arg
  556.         (x0, y0) = self.position()
  557.         dx = x - x0
  558.         dy = y - y0
  559.         return atan2(dy, dx) / self._invradian % self._fullcircle
  560.  
  561.     
  562.     def goto(self, *args):
  563.         """ Go to the given point.
  564.  
  565.         If the pen is down, then a line will be drawn. The turtle's
  566.         orientation does not change.
  567.  
  568.         Two input formats are accepted:
  569.  
  570.            goto(x, y)
  571.            go to point (x, y)
  572.  
  573.            goto((x, y))
  574.            go to point (x, y)
  575.  
  576.         Example:
  577.         >>> turtle.position()
  578.         [0.0, 0.0]
  579.         >>> turtle.goto(50, -45)
  580.         >>> turtle.position()
  581.         [50.0, -45.0]
  582.         """
  583.         if len(args) == 1:
  584.             
  585.             try:
  586.                 (x, y) = args[0]
  587.             raise Error, 'bad point argument: %r' % (args[0],)
  588.  
  589.         else:
  590.             
  591.             try:
  592.                 (x, y) = args
  593.             except:
  594.                 raise Error, 'bad coordinates: %r' % (args[0],)
  595.  
  596.         (x0, y0) = self._origin
  597.         self._goto(x0 + x, y0 - y)
  598.  
  599.     
  600.     def _goto(self, x1, y1):
  601.         (x0, y0) = self._position
  602.         self._position = map(float, (x1, y1))
  603.         if self._filling:
  604.             self._path.append(self._position)
  605.         
  606.         if self._drawing:
  607.             if self._tracing:
  608.                 dx = float(x1 - x0)
  609.                 dy = float(y1 - y0)
  610.                 distance = hypot(dx, dy)
  611.                 nhops = int(distance)
  612.                 item = self._canvas.create_line(x0, y0, x0, y0, width = self._width, capstyle = 'round', fill = self._color)
  613.                 
  614.                 try:
  615.                     for i in range(1, 1 + nhops):
  616.                         x = x0 + dx * i / nhops
  617.                         y = y0 + dy * i / nhops
  618.                         self._canvas.coords(item, x0, y0, x, y)
  619.                         self._draw_turtle((x, y))
  620.                         self._canvas.update()
  621.                         self._canvas.after(self._delay)
  622.                     
  623.                     self._canvas.coords(item, x0, y0, x1, y1)
  624.                     self._canvas.itemconfigure(item, arrow = 'none')
  625.                 except Tkinter.TclError:
  626.                     return None
  627.                 except:
  628.                     None<EXCEPTION MATCH>Tkinter.TclError
  629.                 
  630.  
  631.             None<EXCEPTION MATCH>Tkinter.TclError
  632.             item = self._canvas.create_line(x0, y0, x1, y1, width = self._width, capstyle = 'round', fill = self._color)
  633.             self._items.append(item)
  634.         
  635.         self._draw_turtle()
  636.  
  637.     
  638.     def speed(self, speed):
  639.         """ Set the turtle's speed.
  640.  
  641.         speed must one of these five strings:
  642.  
  643.             'fastest' is a 0 ms delay
  644.             'fast' is a 5 ms delay
  645.             'normal' is a 10 ms delay
  646.             'slow' is a 15 ms delay
  647.             'slowest' is a 20 ms delay
  648.  
  649.          Example:
  650.          >>> turtle.speed('slow')
  651.         """
  652.         
  653.         try:
  654.             speed = speed.strip().lower()
  655.             self._delay = speeds.index(speed) * 5
  656.         except:
  657.             raise ValueError('%r is not a valid speed. speed must be one of %s' % (speed, speeds))
  658.  
  659.  
  660.     
  661.     def delay(self, delay):
  662.         ''' Set the drawing delay in milliseconds.
  663.  
  664.         This is intended to allow finer control of the drawing speed
  665.         than the speed() method
  666.  
  667.         Example:
  668.         >>> turtle.delay(15)
  669.         '''
  670.         if int(delay) < 0:
  671.             raise ValueError('delay must be greater than or equal to 0')
  672.         
  673.         self._delay = int(delay)
  674.  
  675.     
  676.     def _draw_turtle(self, position = []):
  677.         if not self._tracing:
  678.             self._canvas.update()
  679.             return None
  680.         
  681.         if position == []:
  682.             position = self._position
  683.         
  684.         (x, y) = position
  685.         distance = 8
  686.         dx = distance * cos(self._angle * self._invradian)
  687.         dy = distance * sin(self._angle * self._invradian)
  688.         self._delete_turtle()
  689.         self._arrow = self._canvas.create_line(x - dx, y + dy, x, y, width = self._width, arrow = 'last', capstyle = 'round', fill = self._color)
  690.         self._canvas.update()
  691.  
  692.     
  693.     def _delete_turtle(self):
  694.         if self._arrow != 0:
  695.             self._canvas.delete(self._arrow)
  696.             self._arrow = 0
  697.         
  698.  
  699.  
  700. _root = None
  701. _canvas = None
  702. _pen = None
  703. _width = 0.5
  704. _height = 0.75
  705. _startx = None
  706. _starty = None
  707. _title = 'Turtle Graphics'
  708.  
  709. class Pen(RawPen):
  710.     
  711.     def __init__(self):
  712.         global _root, _canvas
  713.         if _root is None:
  714.             _root = Tkinter.Tk()
  715.             _root.wm_protocol('WM_DELETE_WINDOW', self._destroy)
  716.             _root.title(_title)
  717.         
  718.         if _canvas is None:
  719.             _canvas = Tkinter.Canvas(_root, background = 'white')
  720.             _canvas.pack(expand = 1, fill = 'both')
  721.             setup(width = _width, height = _height, startx = _startx, starty = _starty)
  722.         
  723.         RawPen.__init__(self, _canvas)
  724.  
  725.     
  726.     def _destroy(self):
  727.         global _pen, _root, _canvas
  728.         root = self._canvas._root()
  729.         if root is _root:
  730.             _pen = None
  731.             _root = None
  732.             _canvas = None
  733.         
  734.         root.destroy()
  735.  
  736.  
  737.  
  738. def _getpen():
  739.     global _pen
  740.     if not _pen:
  741.         _pen = Pen()
  742.     
  743.     return _pen
  744.  
  745.  
  746. class Turtle(Pen):
  747.     pass
  748.  
  749.  
  750. def degrees():
  751.     _getpen().degrees()
  752.  
  753.  
  754. def radians():
  755.     _getpen().radians()
  756.  
  757.  
  758. def reset():
  759.     _getpen().reset()
  760.  
  761.  
  762. def clear():
  763.     _getpen().clear()
  764.  
  765.  
  766. def tracer(flag):
  767.     _getpen().tracer(flag)
  768.  
  769.  
  770. def forward(distance):
  771.     _getpen().forward(distance)
  772.  
  773.  
  774. def backward(distance):
  775.     _getpen().backward(distance)
  776.  
  777.  
  778. def left(angle):
  779.     _getpen().left(angle)
  780.  
  781.  
  782. def right(angle):
  783.     _getpen().right(angle)
  784.  
  785.  
  786. def up():
  787.     _getpen().up()
  788.  
  789.  
  790. def down():
  791.     _getpen().down()
  792.  
  793.  
  794. def width(width):
  795.     _getpen().width(width)
  796.  
  797.  
  798. def color(*args):
  799.     _getpen().color(*args)
  800.  
  801.  
  802. def write(arg, move = 0):
  803.     _getpen().write(arg, move)
  804.  
  805.  
  806. def fill(flag):
  807.     _getpen().fill(flag)
  808.  
  809.  
  810. def begin_fill():
  811.     _getpen().begin_fill()
  812.  
  813.  
  814. def end_fill():
  815.     _getpen().end_fill()
  816.  
  817.  
  818. def circle(radius, extent = None):
  819.     _getpen().circle(radius, extent)
  820.  
  821.  
  822. def goto(*args):
  823.     _getpen().goto(*args)
  824.  
  825.  
  826. def heading():
  827.     return _getpen().heading()
  828.  
  829.  
  830. def setheading(angle):
  831.     _getpen().setheading(angle)
  832.  
  833.  
  834. def position():
  835.     return _getpen().position()
  836.  
  837.  
  838. def window_width():
  839.     return _getpen().window_width()
  840.  
  841.  
  842. def window_height():
  843.     return _getpen().window_height()
  844.  
  845.  
  846. def setx(xpos):
  847.     _getpen().setx(xpos)
  848.  
  849.  
  850. def sety(ypos):
  851.     _getpen().sety(ypos)
  852.  
  853.  
  854. def towards(*args):
  855.     return _getpen().towards(*args)
  856.  
  857.  
  858. def done():
  859.     _root.mainloop()
  860.  
  861.  
  862. def delay(delay):
  863.     return _getpen().delay(delay)
  864.  
  865.  
  866. def speed(speed):
  867.     return _getpen().speed(speed)
  868.  
  869. for methodname in dir(RawPen):
  870.     if not methodname.startswith('_'):
  871.         eval(methodname).__doc__ = RawPen.__dict__[methodname].__doc__
  872.     
  873.  
  874.  
  875. def setup(**geometry):
  876.     ''' Sets the size and position of the main window.
  877.  
  878.     Keywords are width, height, startx and starty:
  879.  
  880.     width: either a size in pixels or a fraction of the screen.
  881.       Default is 50% of screen.
  882.     height: either the height in pixels or a fraction of the screen.
  883.       Default is 75% of screen.
  884.  
  885.     Setting either width or height to None before drawing will force
  886.       use of default geometry as in older versions of turtle.py
  887.  
  888.     startx: starting position in pixels from the left edge of the screen.
  889.       Default is to center window. Setting startx to None is the default
  890.       and centers window horizontally on screen.
  891.  
  892.     starty: starting position in pixels from the top edge of the screen.
  893.       Default is to center window. Setting starty to None is the default
  894.       and centers window vertically on screen.
  895.  
  896.     Examples:
  897.     >>> setup (width=200, height=200, startx=0, starty=0)
  898.  
  899.     sets window to 200x200 pixels, in upper left of screen
  900.  
  901.     >>> setup(width=.75, height=0.5, startx=None, starty=None)
  902.  
  903.     sets window to 75% of screen by 50% of screen and centers
  904.  
  905.     >>> setup(width=None)
  906.  
  907.     forces use of default geometry as in older versions of turtle.py
  908.     '''
  909.     global _width, _height, _startx, _starty, _width, _height, _startx, _starty
  910.     width = geometry.get('width', _width)
  911.     if width >= 0 or width == None:
  912.         _width = width
  913.     else:
  914.         raise ValueError, 'width can not be less than 0'
  915.     height = geometry.get('height', _height)
  916.     if height >= 0 or height == None:
  917.         _height = height
  918.     else:
  919.         raise ValueError, 'height can not be less than 0'
  920.     startx = geometry.get('startx', _startx)
  921.     if startx >= 0 or startx == None:
  922.         _startx = startx
  923.     else:
  924.         raise ValueError, 'startx can not be less than 0'
  925.     starty = geometry.get('starty', _starty)
  926.     if starty >= 0 or starty == None:
  927.         _starty = starty
  928.     else:
  929.         raise ValueError, 'startx can not be less than 0'
  930.     if _root and _width and _height:
  931.         if _width < _width:
  932.             pass
  933.         elif _width <= 1:
  934.             _width = _root.winfo_screenwidth() * +width
  935.         
  936.         if _height < _height:
  937.             pass
  938.         elif _height <= 1:
  939.             _height = _root.winfo_screenheight() * _height
  940.         
  941.         if _startx is None:
  942.             _startx = (_root.winfo_screenwidth() - _width) / 2
  943.         
  944.         if _starty is None:
  945.             _starty = (_root.winfo_screenheight() - _height) / 2
  946.         
  947.         _root.geometry('%dx%d+%d+%d' % (_width, _height, _startx, _starty))
  948.     
  949.  
  950.  
  951. def title(title):
  952.     '''Set the window title.
  953.  
  954.     By default this is set to \'Turtle Graphics\'
  955.  
  956.     Example:
  957.     >>> title("My Window")
  958.     '''
  959.     global _title
  960.     _title = title
  961.  
  962.  
  963. def demo():
  964.     reset()
  965.     tracer(1)
  966.     up()
  967.     backward(100)
  968.     down()
  969.     width(3)
  970.     for i in range(3):
  971.         if i == 2:
  972.             fill(1)
  973.         
  974.         for j in range(4):
  975.             forward(20)
  976.             left(90)
  977.         
  978.         if i == 2:
  979.             color('maroon')
  980.             fill(0)
  981.         
  982.         up()
  983.         forward(30)
  984.         down()
  985.     
  986.     width(1)
  987.     color('black')
  988.     tracer(0)
  989.     up()
  990.     right(90)
  991.     forward(100)
  992.     right(90)
  993.     forward(100)
  994.     right(180)
  995.     down()
  996.     write('startstart', 1)
  997.     write('start', 1)
  998.     color('red')
  999.     for i in range(5):
  1000.         forward(20)
  1001.         left(90)
  1002.         forward(20)
  1003.         right(90)
  1004.     
  1005.     fill(1)
  1006.     for i in range(5):
  1007.         forward(20)
  1008.         left(90)
  1009.         forward(20)
  1010.         right(90)
  1011.     
  1012.     fill(0)
  1013.     tracer(1)
  1014.     write('end')
  1015.  
  1016.  
  1017. def demo2():
  1018.     speed('fast')
  1019.     width(3)
  1020.     setheading(towards(0, 0))
  1021.     (x, y) = position()
  1022.     r = (x ** 2 + y ** 2) ** 0.5 / 2
  1023.     right(90)
  1024.     pendown = True
  1025.     for i in range(18):
  1026.         if pendown:
  1027.             up()
  1028.             pendown = False
  1029.         else:
  1030.             down()
  1031.             pendown = True
  1032.         circle(r, 10)
  1033.     
  1034.     sleep(2)
  1035.     reset()
  1036.     left(90)
  1037.     l = 10
  1038.     color('green')
  1039.     width(3)
  1040.     left(180)
  1041.     sp = 5
  1042.     for i in range(-2, 16):
  1043.         if i > 0:
  1044.             color(1 - 0.05 * i, 0, 0.05 * i)
  1045.             fill(1)
  1046.             color('green')
  1047.         
  1048.         for j in range(3):
  1049.             forward(l)
  1050.             left(120)
  1051.         
  1052.         l += 10
  1053.         left(15)
  1054.         if sp > 0:
  1055.             sp = sp - 1
  1056.             speed(speeds[sp])
  1057.             continue
  1058.     
  1059.     color(0.25, 0, 0.75)
  1060.     fill(0)
  1061.     left(120)
  1062.     up()
  1063.     forward(70)
  1064.     right(30)
  1065.     down()
  1066.     color('red')
  1067.     speed('fastest')
  1068.     fill(1)
  1069.     for i in range(4):
  1070.         circle(50, 90)
  1071.         right(90)
  1072.         forward(30)
  1073.         right(90)
  1074.     
  1075.     color('yellow')
  1076.     fill(0)
  1077.     left(90)
  1078.     up()
  1079.     forward(30)
  1080.     down()
  1081.     color('red')
  1082.     turtle = Turtle()
  1083.     turtle.reset()
  1084.     turtle.left(90)
  1085.     turtle.speed('normal')
  1086.     turtle.up()
  1087.     turtle.goto(280, 40)
  1088.     turtle.left(24)
  1089.     turtle.down()
  1090.     turtle.speed('fast')
  1091.     turtle.color('blue')
  1092.     turtle.width(2)
  1093.     speed('fastest')
  1094.     setheading(towards(turtle))
  1095.     while abs(position()[0] - turtle.position()[0]) > 4 or abs(position()[1] - turtle.position()[1]) > 4:
  1096.         turtle.forward(3.5)
  1097.         turtle.left(0.6)
  1098.         setheading(towards(turtle))
  1099.         forward(4)
  1100.     write('CAUGHT! ', move = True)
  1101.  
  1102. if __name__ == '__main__':
  1103.     demo()
  1104.     sleep(3)
  1105.     demo2()
  1106.     done()
  1107.  
  1108.